package main

import "fmt"

/*
* Author: JacksonCoder
* CreateTime: 2024/12/1
 */

type User struct {
	Name      string
	FirstName string
	Age       int
}

func NewUser() {
	// 初始化 结构体
	u := User{}
	fmt.Printf("%v \n", u)
	fmt.Printf("%+v \n", u)

	// up is a pointer
	up := &User{}
	fmt.Printf("up : %+v \n", up)
	up2 := new(User)       // new 返回的是指针
	println(up2.FirstName) // 可以访问
	fmt.Printf("up2 : %+v \n", up2)

	u4 := User{Name: "alen", Age: 9}
	fmt.Printf("up : %+v \n", u4)
	u5 := User{"alex", "yuehan", 24} // 不推荐
	fmt.Printf("up : %+v \n", u5)

	u4.Name = "ugen"
	fmt.Printf("up : %+v \n", u4)
	u5.Name = "alice"
	fmt.Printf("up : %+v \n", u5)

	var up3 *User
	// nil 上访问字段， 或者方法
	//println(up3.Name) //  runtime error : invalid memory address or nil pointer dereference
	println(up3)

}

func (u User) ChangeName(name string) {
	fmt.Printf("change name 中 u 的地址: %p \n", &u)
	u.Name = name
}

func (u *User) ChangeAge(age int) {
	fmt.Printf("change age 中 u 的地址: %p \n", u)
	u.Age = age
}

func ChangeUser() {
	u1 := User{Name: "Tom", Age: 18}
	fmt.Printf("before change of u1  : %+v   u1地址是：%p \n", u1, &u1)
	// (&u1).ChangeAge(53)
	u1.ChangeAge(53)
	// 这一步执行的时候，实际上是复制了一个 User结构体， u1实际上是复制体
	// 改动过的name也是  复制体上面的name
	u1.ChangeName("Jerry")
	//println(u1)   只能打普通数据类型
	fmt.Printf("u1  : %+v \n", u1)

	up1 := &User{}
	// (*up1).ChangeName("Bob")
	up1.ChangeName("Bob")
	up1.ChangeAge(214)
	fmt.Printf("up1 : %+v \n", up1)

}

type Integer int

func UseInt() {
	i1 := 10
	i2 := Integer(i1)
	println("i2 = ", i2)
	var i3 Integer = 11
	println("i3 = ", i3)
}
